package com.design.pattern.singleton;

public class SingletonV2 {

    /**
     * volatile 防止重排序 java内存模型 保证可见性
     */
    private volatile static SingletonV2 singletonV2;
    // 双重检验锁 解决懒汉式读和写都加锁
    private SingletonV2()  {
        if(singletonV2 !=null){
            throw new RuntimeException("对象已经被初始化。。。。！");
        }

    }

    public static SingletonV2 getInstance() {

        // 当多个线程同时可能在new对象的时候，才会加锁，保证线程安全问题
        if (singletonV2 == null) {
            synchronized (SingletonV2.class) {
                // 当前线程已经获取到锁了，再判断该对象是否已经初始化，没有初始化的话开始创建
                if (singletonV2 == null) {
                    singletonV2 = new SingletonV2();
                }
            }
        }
        return singletonV2;
    }

}
